import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
NProgress.configure({ showSpinner: false }) // NProgress Configuration
// 从@/utils/getMenuList.js中导入initMenu方法，用于获取菜单列表数据
import { initMenu } from '@/utils/menu'
// 白名单列表
const whiteList = ['/login'] // no redirect whitelist

// 路由导航守卫(全局前置守卫)的作用：每次进行路由跳转之前都会经过此路由导航守卫(类似于拦截器)
// beforeEach函数中接收一个回调函数，回调函数中有三个参数。
// to 代表将要访问的页面路径，from 代表是从哪个路径跳转而来的
// next 代表放行的函数
// 为路由对象，添加beforeEach导航守卫
router.beforeEach(async(to, from, next) => {
  // 开启进度条
  NProgress.start()

  // set page title 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // determine whether the user has logged in
  // 调用utils/auth.js中的getToken()方法，从Cookie中获取保存的token值
  const hasToken = getToken()

  if (hasToken) {
    // 调用utils/menus.js中定义的初始化菜单列表的方法,实现将后端响应过来的
    // 菜单列表数据保存到Vuex以及router/index.js中
    initMenu(router, store)
    // 如果将要访问的页面路径是/login，就调用next()放行到登录页面
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({ path: '/' })
      NProgress.done() // 停止进度条
    } else {
      // store.getters.name 调用的是getter.js中定义的name,
      // 其值来源于store/modules/user.js里state中定义的用户名name
      /* const hasGetUserInfo = store.getters.name
      if (hasGetUserInfo) {
        // 如果获取到了用户名则调用next()方法进行放行。
        next()
      } else {*/
      // 判断当前登录用户的角色列表是否为空，如果为空再请求user/getInfo获取角色列表
      if (store.getters.roles.length === 0) {
        try {
          // get user info 调用modules/user.js用户模块中的getInfo方法，获取用户信息
          await store.dispatch('user/getInfo')
          next() // 获取到用户信息后再调用next()方法放行
        } catch (error) {
          // remove token and go to login page to re-login 调用user模块的resetToken方法进行重置token
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          // 强制拦截后跳转到登录页面，设置redirect参数，即登录后再重定向到用户想要访问的页面
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      } else {
        // 如果当前登录用户的角色列表有数据的话，就直接放行
        next()
      }
    }
  } else {
    /* has no token*/
    // 检测to.path路径是否在白名单内，如果不是则放行，是的话就拦截跳转到登录页面
    if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly
      next()
    } else {
      // other pages that do not have permission to access are redirected to the login page.
      next(`/login?redirect=${to.path}`)
      NProgress.done() // 关闭进度条
    }
  }
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})
